/*
  1. 获取用户的收货地址
    1.1 绑定点击事件
    1.2 获取用户对小程序所授予 获取地址的权限状态 scope
        1.2.1 假设 用户 点击获取收货地址的提示框确定的时候
              scope 值 true 直接调用 获取收货地址
        1.2.2 假设 用户 从来没有调用过 收货地址的api
              scope 值 undefined  直接调用 获取收货地址    
        1.2.3 假设 用户 点击获取收货地址的提示框取消的时候    
              scope 值 false
              1 有道用户 自己 打开 授权设置页面 当用户从新给与 获取地址权限的时候
              2 获取收货地址
    1.3把获取到的收货地址存入刀本地存储中  
  2.页面加载完毕
    2.1 获取本地存储中的地址数据
    2.2 把数据 设置给打他中的一个变量   
  3. onShow
    3.0 回到了商品详情页面 第一次添加商品的时候 手动添加了属性
        num = 1
        checked = true
    3.1 获取缓存中的购物车数组
    3.2 把购物车数据 填充到data中  
  4.全选的实现 数据的展示
    1. 在onShow中获取缓存中的购物车数组
    2. 根据购物车中的商品进行计算 所有的商品都被选中了 checked = true 全被选中         
*/ 
import {getSetting,chooseAddress,openSetting,showModal,showToast} from '../../utils/asyncWx.js';
import regeneratorRuntime from '../../lib/runtime/runtime';
Page({
  data: {
    address: {},
    cart: [],
    allChecked: false,
    totalPrice: 0,
    totalNum: 0
  },
  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {
    // 2.页面加载完毕
    //   2.1 获取本地存储中的地址数据
    const address = wx.getStorageSync("address")    
    //3.1获取缓存中的购物车数据
    const cart = wx.getStorageSync("cart") || [];
    // 4.0计算全选
    //every 数组方法 会遍历 会接收一个回调函数 那么 每一个回调函数都返回true 那么every方法的返回值就为true
    //只要 有一个回调函数返回了false 那么不再循环执行了，直接返回false
    //// const allChecked = cart.length?cart.every(v=>v.checked): false
    // let allChecked = true
    //总价格 总数量
    // let totalPrice = 0
    // let totalNum = 0
    // cart.forEach(v => {
    //   if (v.checked) {
    //     totalPrice += v.num * v.goods_price
    //     totalNum += v.num
    //   }else {
    //     allChecked = false
    //   }
    // })
    //判断数组是否为空
    // allChecked = cart.length != 0 ? allChecked : false
    //   2.2 把数据 设置给打他中的一个变量   
    // this.setData({
    //   address,
    //   cart,
    //   allChecked,
    //   totalPrice,
    //   totalNum
    // })
    this.setData({address})
    this.setCart(cart)
  },
  //添加收货地址
  async handleChooseAddress () {
    try {
      //1. 获取权限状态
      const res1 = await getSetting()
      const scopeAddress = res1.authSetting['scope.address']
      //2. 判断 权限状态
      if (scopeAddress === false) { 
        await openSetting()
      }
      //4. 可以调用api 收货地址代码
      let address = await chooseAddress()
      address.all = address.provinceName + address.cityName + address.countyName + address.detailInfo
      //5.存入到缓存中
      wx.setStorageSync("address", address)
    } catch (error) {
      // console.log(error)
    }
  },
  //商品的选中
  handleItemChange(e) {
    //1 获取被修改的商品的id
    let goodsId = e.currentTarget.dataset.id
    //2 获取购物车数组
    let {cart} = this.data
    //3 找到被修改的商品对象
    let index = cart.findIndex(v => v.goods_id === goodsId)
    //4 选中状态取反
    cart[index].checked = !cart[index].checked
    this.setCart(cart)
  },
  //设置购物车状态，同时重新计算底部工具栏的数据(全选、总价格、购买数量等)
  setCart(cart) {
    //5-6 把购物车数据重新设置回data中和缓存中
    // this.setData({
    //   cart
    // })
    //7 重新计算全选，总价格，总数量等
    let allChecked = true
    //总价格 总数量
    let totalPrice = 0
    let totalNum = 0
    cart.forEach(v => {
      if (v.checked) {
        totalPrice += v.num * v.goods_price
        totalNum += v.num
      }else {
        allChecked = false
      }
    })
    //判断数组是否为空
    allChecked = cart.length != 0 ? allChecked : false
    //   2.2 把数据 设置给打他中的一个变量   
    this.setData({
      cart,
      allChecked,
      totalPrice,
      totalNum
    })
    wx.setStorageSync("cart", cart);
  },
  //商品全选功能
  handleAllCheck() {
    //1 获取data中的数据
    let {cart,allChecked} = this.data
    //2 修改值
    allChecked = !allChecked
    //3 循环修改cart数组中的商品选中状态
    cart.forEach(v => v.checked = allChecked)
    //4 把修改后的值填充回data或缓存中
    this.setCart(cart)
  },
  //商品数量的编辑功能
  async handleItemNumEduit(e) {
    //1 获取传递过来的参数
    const {operation,id} = e.currentTarget.dataset
    //2 获取购物车数据
    let {cart} = this.data
    //3 找到需要修改的商品的索引
    const index = cart.findIndex(v => v.goods_id === id)
    //4 判断是否要进行删除
    if (cart[index].num === 1 && operation === -1) {
      // wx.showModal({
      //   title: '提示',
      //   content: '确认删除?',
      //   success: (res) => {
      //     if (res.confirm) {
      //       cart.splice(index,1)
      //       this.setCart(cart)
      //     } else if (res.cancel) {
      //       console.log('用户点击取消')
      //     }
      //   }
      // })
      const res = await showModal({ content: "确认删除?" })
      if (res.confirm) {
        cart.splice(index,1)
        this.setCart(cart)
      }
    }else {
      //4 进行修改数量
      cart[index].num += operation
      //5 设置回缓存和data中
      this.setCart(cart)
    }
  },
  //结算功能
  async handlePay() {
    let {address,totalNum} = this.data
    //判断收货地址
    if (!address.userName) {
      await showToast({title: "您还没有选择收货地址"})
      return
    }
    //判断用户有没有选购商品
    if (totalNum === 0) {
      await showToast({title: "您还没有选购商品"})
      return
    }
    // 跳转到支付页面
    wx.navigateTo({
      url: '/pages/pay/index'
    });
  }
})
